package com.tuyrt.`as`.proj.main.fragment.home

import android.os.Bundle
import android.util.SparseArray
import android.view.View
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.lifecycle.ViewModelProvider
import androidx.viewpager.widget.PagerAdapter
import androidx.viewpager.widget.ViewPager
import com.tuyrt.`as`.proj.common.ui.component.HiBaseFragment
import com.tuyrt.`as`.proj.main.R
import com.tuyrt.`as`.proj.main.model.TabCategory
import com.tuyrt.hi.ui.tab.bottom.HiTabBottomLayout
import com.tuyrt.hi.ui.tab.common.IHiTabLayout.OnTabSelectedChangeListener
import com.tuyrt.hi.ui.tab.top.HiTabTopInfo
import kotlinx.android.synthetic.main.fragment_home.*

/**
 *
 */
class HomePageFragment : HiBaseFragment() {

    private var topTabSelectIndex: Int = 0
    private val DEFAULT_SELECT_INDEX: Int = 0
    val topTabs = mutableListOf<HiTabTopInfo<Int>>()

    override fun getLayoutId() = R.layout.fragment_home

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 解决 HiTabBottomLayout 遮挡 viewPanger
        HiTabBottomLayout.clipBottomPadding(view_pager)

        val viewModel = ViewModelProvider(this).get(HomeViewModel::class.java)
        viewModel.queryTabList().observe(viewLifecycleOwner) {
            it?.let { updateUI(it) }
        }
    }

    private val onTabSelectedChangeListener = OnTabSelectedChangeListener<HiTabTopInfo<*>> { index, preInfo, nextInfo ->
        if (view_pager.currentItem != index) {
            view_pager.setCurrentItem(index, false)
        }
    }

    private fun updateUI(data: List<TabCategory>) {
        //topTabs需要提到全局，
        //因为addOnPageChangeListener  在第一次设置的时候，他就绑定了一次的局部变量topTabs
        //而再次刷新时，并没有 重新设置PageChangeListener，但是第一次的topTabs已经被释放了。
        topTabs.clear()
        data.forEachIndexed { index, tabCategory ->
            val defaultColor = ContextCompat.getColor(requireContext(), R.color.color_999)
            val selectColor = ContextCompat.getColor(requireContext(), R.color.color_999)
            val tabTopInfo = HiTabTopInfo(tabCategory.categoryName, defaultColor, selectColor)
            topTabs.add(tabTopInfo)
        }

        val topTabLayout = top_tab_layout
        val viewPager = view_pager

        topTabLayout.inflateInfo(topTabs as List<HiTabTopInfo<*>>)
        topTabLayout.defaultSelected(topTabs[DEFAULT_SELECT_INDEX])
        topTabLayout.addOnTabSelectedChangeListener(onTabSelectedChangeListener)

        val adapter = if (viewPager.adapter == null) {
            val homePagerAdapter = HomePagerAdapter(childFragmentManager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
            viewPager.adapter = homePagerAdapter
            viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
                override fun onPageSelected(position: Int) {
                    // 这个方法有两种可能被出发：第一种切换顶部tab  第二种手动滑动翻页
                    // 第一种情况不需要手动去切换fragment

                    // 如果手动滑动翻页:
                    if (position != topTabSelectIndex) {
                        // 去通知 topTabLayout 进行切换
                        topTabLayout.defaultSelected(topTabs[position])
                        topTabSelectIndex = position
                    }
                }
            })
            homePagerAdapter
        } else {
            viewPager.adapter as HomePagerAdapter
        }
        adapter.update(data)
    }

    inner class HomePagerAdapter(fm: FragmentManager, behavior: Int) : FragmentPagerAdapter(fm, behavior) {

        private val tabs = mutableListOf<TabCategory>()
        private val fragments = SparseArray<Fragment>(tabs.size)

        override fun getCount(): Int {
            return tabs.size
        }

        override fun getItem(position: Int): Fragment {
            val categoryId = tabs[position].categoryId
            val categoryKey = categoryId.toInt()
            var fragment = fragments.get(categoryKey, null)
            if (fragment == null) {
                fragment = HomeTabFragment.newInstance(tabs[position].categoryId)
                fragments.put(categoryKey, fragment)
            }
            return fragment
        }

        override fun getItemPosition(obj: Any): Int {
            // 需要判断两次刷新前后 fragment 在viewpager中的位置 有没有改变，如果改变了，返回PagerAdapter.POSITION_NONE，否则返回PagerAdapter.POSITION_UNCHANGED。
            //  这样做是为了避免缓存数据 和 接口数据返回的顶部导航栏数据不一样的情况，导致页面的fragment 会被先 detach，再 attach，重复执行生命周期
            // 同时还能兼顾 缓存数据返回的顶部导航栏 和 接口返回的数据 不一致的情况

            //刷新之前 该位置对应的 fragment对象就是 obj，再和该位置 刷新后的fragment对象 对比 是否是同一个
            val indexOfValue = fragments.indexOfValue(obj as Fragment)
            val fragment = getItem(indexOfValue)
            return if (fragment == obj) PagerAdapter.POSITION_UNCHANGED else PagerAdapter.POSITION_NONE
        }

        //如果使用position当做Id,刷新前后会出现因复用，导致位置错乱问题
        override fun getItemId(position: Int): Long {
            return tabs[position].categoryId.toLong()
        }

        fun update(list: List<TabCategory>) {
            tabs.clear()
            tabs.addAll(list)
            notifyDataSetChanged()
        }
    }
}